home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / GraphicViewers / ViewGif2 / Source / Controller.m < prev    next >
Text File  |  1991-08-14  |  8KB  |  237 lines

  1. /*****************************************************************************/
  2. /* Controller.m                                     */
  3. /* implementation file of Controller class of ViewGif2 application           */
  4. /* January 1990  Carl F. Sutter                             */
  5. /* The Controller handes the whole program, and dispatches processing to     */
  6. /* the various modules.  Most of the work is done by those isolated modules, */
  7. /* so this "main program" is really quite simple.                 */
  8. /*****************************************************************************/
  9.  
  10. #import "Controller.h"
  11. #import "ViewBitmap.h"
  12. #import <appkit/Application.h>
  13. #import <appkit/OpenPanel.h>
  14. #import <appkit/SavePanel.h>
  15. #import <appkit/PageLayout.h>
  16. #import <string.h>         // for strcpy, strcat
  17. #import <appkit/publicWraps.h>   // for NXBeep
  18.  
  19. @implementation Controller
  20.  
  21. /*****************************************************************************/
  22. /* new - initialize the controller                         */
  23. /*****************************************************************************/
  24. + new
  25.    {
  26.    self = [super new];
  27.    /* set up the queue */
  28.    Queue = [FileQueue new:self action:@selector(nextFromQueue:)];
  29.    [Queue retrieveNextWhenReady];
  30.    /* set up the decoder */
  31.    Decoder = [DecodeGIF new:self action:@selector(decoderDone:)];
  32.    /* set up the activate menu & slideshow panel */
  33.    activateMenu = [ActivateMenu new];
  34.    return( self );
  35.    } /* new 1/31/90 CFS */
  36.    
  37.  
  38. /*****************************************************************************/
  39. /* showQueue: - tell queue to display its panel                     */
  40. /*****************************************************************************/
  41. - showQueue:sender
  42.    {
  43.    [Queue show:self];
  44.    return( self );
  45.    } /* showQueue: 1/22/90 CFS */
  46.  
  47.  
  48. /*****************************************************************************/
  49. /* showDecoder: - tell decoder to show its panel                     */
  50. /*****************************************************************************/
  51. - showDecoder:sender
  52.    {
  53.    [Decoder show:self];
  54.    return( self );
  55.    } /* showDecoder: 1/22/90 CFS */
  56.  
  57.  
  58. /*****************************************************************************/
  59. /* showSlideshow: - tell activate menu slide show panel to appear         */
  60. /*****************************************************************************/
  61. - showSlideshow:sender
  62.    {
  63.    [activateMenu show:self];
  64.    return( self );
  65.    } /* showSlideshow: 3/7/90 CFS */
  66.  
  67.  
  68. /***************************************************************************/
  69. /* appAcceptsAnotherFile is an application delegate method which        */
  70. /* returns whether it is OK for the application to try to open more files  */
  71. /* with the appOpenFile:type:                           */
  72. /***************************************************************************/
  73. - (BOOL)appAcceptsAnotherFile:sender;
  74.    {
  75.    return( YES );
  76.    } /* appAcceptsAnotherFile 1/22/90 CFS */
  77.  
  78.  
  79. /***************************************************************************/
  80. /* appOpenFile:type: - delegate message sent to open the specified file.   */
  81. /* It is normally called by the Application object in response to open        */
  82. /* requests from the Workspace.                           */
  83. /***************************************************************************/
  84. - (int)appOpenFile:(const char *)filename type:(const char *)aType;
  85.    {
  86.    return( [Queue addItem:filename] );  
  87.    } /* appOpenFile 1/22/90 CFS */
  88.  
  89.  
  90. /***************************************************************************/
  91. /* openRequest - allows user to choose a new file(s) using the open panel  */
  92. /***************************************************************************/
  93. - openRequest:sender
  94.    {
  95.    const char        *directory;
  96.    const char        *const *files;
  97.    static const char    *const types[2] = {"gif", NULL};
  98.    id openpanel =    [[OpenPanel new] allowMultipleFiles:YES];
  99.    char         szFileName[160];
  100.  
  101.    if ([openpanel runModalForTypes:types])
  102.       {
  103.       files = [openpanel filenames];        // list of multiple files
  104.       directory = [openpanel directory];
  105.       while (files && *files)
  106.          {
  107.      strcpy( szFileName, directory );
  108.      strcat( szFileName, "/" );
  109.      strcat( szFileName, *files );
  110.          [Queue addItem:szFileName];
  111.      files++;
  112.      }
  113.       }     
  114.    return( self );
  115.    } /* openRequest 1/22/90 CFS */
  116.  
  117.  
  118. /***************************************************************************/
  119. /* saveToTiff: - gets a filename to save the image in TIFF format       */
  120. /***************************************************************************/
  121. - saveToTiff:sender;
  122.    {
  123.    char            szFileName[40];
  124.    const char        *fileName;
  125.    id savepanel =    [[SavePanel new] setPrompt:"Save To TIFF File:"];
  126.  
  127.    /* first, make sure a window is available to save */
  128.    if ([NXApp mainWindow] == nil)
  129.       {
  130.       [self errorAlert:"No main window to save TIFF file for."];
  131.       return( self );
  132.       }
  133.    
  134.    /* get the gif filename, remove the .gif, and add a .tiff */
  135.    strcpy( szFileName, [[NXApp mainWindow] title] );
  136.    *(strrchr( szFileName, '.' )) = 0;
  137.    strcat( szFileName, ".tiff" );
  138.    
  139.    /* run the save panel, and if a name was entered, save the bitmap */
  140.    if (([savepanel runModalForDirectory:"." file:szFileName]) && 
  141.       (fileName = [savepanel filename]))
  142.          [[[[NXApp mainWindow] contentView] docView] saveBitmapToTiff:fileName];
  143.      
  144.    return( self );
  145.    } /* saveToReqest 10/27/89 CFS */
  146.  
  147.  
  148. /***************************************************************************/
  149. /* nextFromQueue - message from queue with a new file to decode            */
  150. /***************************************************************************/
  151. - nextFromQueue:(char *)szFileName
  152.    {
  153.    /* send the file to the decoder */
  154.    [Decoder decodeFile:szFileName];
  155.    strcpy( szCurrentFile, strrchr( szFileName, '/' ) + 1);
  156.    return( self );
  157.    } /* nextFromQueue 1/22/90 CFS */
  158.  
  159.  
  160. /***************************************************************************/
  161. /* decoderDone - message from decoder saying it is ready for a new file    */
  162. /***************************************************************************/
  163. - decoderDone:(Bitmap *)bmpImage
  164.    {
  165.    ViewBitmap    *displayView;
  166.    
  167.    if (bmpImage != nil)
  168.       {
  169.       displayView = [ViewBitmap newBitmap:bmpImage title:szCurrentFile
  170.                                 topLeft:[self nextTopLeft]];
  171.       [displayView setMiniwindowIcon:"gif"];   
  172.       [activateMenu addDocument:[displayView window]];   
  173.       [displayView setCloseNotify:activateMenu];
  174.       }
  175.    /* tell the queue to send a new file to decode */
  176.    [Queue retrieveNextWhenReady];
  177.    return( self );
  178.    } /* decoderDone 1/23/90 CFS */
  179.  
  180.  
  181. /***************************************************************************/
  182. /* nextTopLeft - return the next good top left window position           */
  183. /***************************************************************************/
  184. - (NXPoint)nextTopLeft
  185.    {
  186.    #define OFFSET 10.0
  187.    #define MAX_STEPS 20
  188.    #define INITIAL_X 356.0
  189.    #define INITIAL_Y 241.0
  190.    NXPoint    nxpTopLeft;
  191.    static int    nCurStep = 0;
  192.    
  193.    nxpTopLeft.x = INITIAL_X + nCurStep * OFFSET;
  194.    nxpTopLeft.y = INITIAL_Y + nCurStep * OFFSET;
  195.    if (++nCurStep > MAX_STEPS) nCurStep = 0;
  196.    return( nxpTopLeft );
  197.    } /* nextTopLeft 1/24/90 CFS */
  198.  
  199.  
  200. /***************************************************************************/
  201. /* errorAlert - put the message in an alert panel               */
  202. /***************************************************************************/
  203. - errorAlert:(char *)szMessage
  204.    {
  205.    NXRunAlertPanel( "ViewGif2 Error", szMessage, "OK", NULL, NULL );
  206.    return( self );
  207.    } /* errorAlert 10/30/89 CFS */
  208.  
  209.  
  210. /***************************************************************************/
  211. /* printRequest - print the main window                       */
  212. /***************************************************************************/
  213. - printRequest:sender
  214.    {
  215.    id  curView = [[[NXApp mainWindow] contentView] docView];
  216.    if (curView == nil)
  217.       {
  218.       [self errorAlert:"No main window to print."];
  219.       return( self );
  220.       }
  221.    [curView printPSCode:self];
  222.    return( self );
  223.    } /* printRequest 10/23/89 CFS */
  224.  
  225.    
  226. /***************************************************************************/
  227. /* pageLayout - bring up page layout panel                   */
  228. /***************************************************************************/
  229. - pageLayout:sender
  230.    {
  231.    [[PageLayout new] runModal]; 
  232.    return( self );
  233.    }  /* pageLayout 10/30/89 CFS */ 
  234.  
  235.  
  236. @end
  237.